package com.orm.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * Hibernate 工具类
 * 获取session
 * 获取currentsession
 * 虚拟机关闭释放资源
 **/
public class HibernateUtils {
    //sessionFactory工厂
    private static SessionFactory factory;
    static {
        Configuration configuration=new Configuration().configure();
        factory = configuration.buildSessionFactory();
        //在关闭虚拟机的时候释放资源
        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("关闭虚拟机，释放资源！！");
                factory.close();
            }
        }));
    }

    /**
     * 获取session对象，总是会打开一个新的session
     * @return
     */
    public static Session getSession(){
        Session session = factory.openSession();
        session = factory.openSession();
        return session;
    }

    /**
     * 获取当前线程中绑定的线程session，必须在hibernate.cfg.xml中配置，
     * 1，底层使用的是ThreadLocal，在程序之间共享session
     *,2，如果提交或回滚事务，底层将自动关闭session，必须手动添加事务，否则会报错
     * @return
     */
    public static Session getCurrentSession(){
        Session session = factory.getCurrentSession();
        session = factory.getCurrentSession();
        return session;
    }
}
